#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define TIME (1e3*clock()/CLOCKS_PER_SEC)
#define debug(fmt,...) fprintf(stderr, fmt, ##__VA_ARGS__)
#define debugln(fmt,...) fprintf(stderr, "[%d] " fmt, __LINE__,##__VA_ARGS__)
bool memBeg;
char fetch() {
    return getchar();
}
int readint() {
    char c=fetch(); int ret=0,neg=1;
    for(;c<'0'||c>'9';c=fetch()) if(c=='-') neg=-1;
    for(;'0'<=c&&c<='9';c=fetch()) ret=ret*10+(c&15);
    return ret*neg;
}
constexpr int maxn=1<<18|5,maxlg=22;
int n,m,K,_a_[maxn],a[maxn],c[maxn],pos[maxn],id[maxn],need[maxn];
bitset<maxn> host[maxlg],qry;
void mian() {
    for(int i=1;i<=(1<<K);i++) {
        int p=(1<<K)+i-1;
        for(int j=1;j<=K;j++) {
            int t=host[j][(i-1)>>j];
            if(t) p^=(1<<(j-1));
        }
        pos[i]=p; id[p]=i;
        need[i]=need[i-1];
        while((1<<need[i])<i) need[i]++;
        // debug("i = %d, pos = %d\n",i,pos[i]);
    }
}
struct info {
    int vad;
    ll win[maxlg],ano;
    info() {
        vad=ano=0;
        memset(win,0,sizeof(win));
    }
    bool operator==(const info &o) const {
        if(vad!=o.vad||ano!=o.ano) return false;
        for(int i=0;i<=K;i++) {
            if(win[i]!=o.win[i]) return false;
        }
        return true;
    }
} nod[maxn];
info merge(const info &lhs,const info &rhs,int lvl) {
    info ret;
    if(lhs.vad&((1<<lvl)-1)) {
        ret=rhs;
    }
    if(lhs.vad-(lhs.vad&((1<<lvl)-1))) {
        ret.ano+=lhs.ano;
    }
    for(int i=lvl;i<=K;i++) {
        if(lhs.vad&(1<<i)) {
            ret.vad|=(1<<i);
            ret.win[i]+=lhs.win[i];
        }
    }
    return ret;
}
ll ret[maxn];
void query() {
    int X[4];
    for(int i=0;i<4;i++) X[i]=readint();
    for(int i=1;i<=n;i++) a[i]=_a_[i]^X[i&3];
    for(int i=1;i<=(1<<K);i++) {
        nod[pos[i]]=info();
        nod[pos[i]].vad=(1<<(K+1))-1;
        nod[pos[i]].ano=i;
    }
    for(int i=(1<<K)-1;i>=1;i--) {
        int t=K-__lg(i);
        nod[i]=merge(nod[i<<1],nod[i<<1|1],t);
    }
    for(int i=1;i<=n;i++) {
        // debug("i = %d, a[i] = %d\n",i,a[i]);
        nod[pos[i]]=info();
        nod[pos[i]].vad=1<<min(a[i],K);
        nod[pos[i]].win[min(a[i],K)]=i;
        for(int j=1,p=pos[i];j<=K;j++,p>>=1) {
            auto tmp=nod[p>>1];
            nod[p>>1]=merge(nod[(p|1)^1],nod[p|1],j);
            if(nod[p>>1]==tmp) break;
            // if(nod[p>>1].vad==tmp.vad) {
            //     for(int k=0;k<=K;k++) {
            //         debug("%lld ",nod[p>>1].win[k]-tmp.win[k]);
            //     }
            //     debug(": det = %lld\n",nod[p>>1].ano-tmp.ano);
            // }
        }
        // debugln("-------------------i = %d-----------------\n",i);
        // for(int j=1;j<(1<<(K+1));j++) {
        //     debug("j = %d: vad = %d, ano = %lld\n",j,nod[j].vad,nod[j].ano);
        //     for(int k=0;k<=K;k++) debug("%lld ",nod[j].win[k]); debug("\n");
        // }
        if(qry[i]) {
            auto &tmp=nod[pos[i]>>need[i]];
            ret[i]=accumulate(tmp.win,tmp.win+K+1,tmp.ano);
        }
    }
    ll out=0;
    for(int i=1;i<=m;i++) {
        out^=(i*ret[c[i]]);
        // debug("ret[i = %d] = %lld\n",i,ret[c[i]]);
    }
    printf("%lld\n",out);
}
bool memEn;
void fl() {
    freopen("arena.in","r",stdin);
    freopen("arena.out","w",stdout);
}
int main() {
    debug("%.24lf\n",fabs(&memEn-&memBeg)/1024.0/1024.0);
#ifdef LOCAL
    freopen("debug","w",stderr);
#endif
    fl();
    n=readint(); m=readint();
    for(int i=1;i<=n;i++) _a_[i]=readint();
    for(int i=1;i<=m;i++) {
        c[i]=readint();
        qry[c[i]]=1;
    }
    while((1<<K)<n) K++;
    for(int i=1;i<=K;i++) {
        for(int j=0;j<(1<<(K-i));j++) {
            char t=fetch();
            while(t<'0'||t>'9') t=fetch();
            if(t&1) host[i][j]=1;
        }
    }
    mian();
    int _=readint();
    // debugln("time = %lf\n",TIME);
    while(_--) query();
    return 0;
}
/*
g++ trash0.cpp -o trash0 -std=c++14 -O2 -Wall -Wextra -Wshadow
# -fsanitize=address,undefined
1 1 5 4 19
19 4 1 1 5
*/